package cn.tedu.justone.pack01;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《》
 */


public class Demo02_案例测试lock的等待过程是否会被打断 {
    //案例测试lock的等待过程是否被会打断
    //案例测试lock的等待过程是否被会打断
    //案例测试lock的等待过程是否被会打断
    // 1,测试思路：让t1线程先进入myLock.lock();t2在锁前面等待t1释放该锁。
    //   在等待过程中我们执行t2.interrupt();进行中断，但最后还能是看到t2
    //   获得锁并执行"重要任务"。
    // 2,测试结论：x.lock()前面等待的线程是不可被中断的(不会放弃等待)，
    //   他们会一直等下去。
    //
    public static void main(String[] args) {
        Table table = new Table();

        Thread t1 = new Thread("男生"){
            @Override
            public void run() {
                table.eatMi();
            }
        };

        Thread t2 = new Thread("女生"){
            @Override
            public void run() {
                table.eatMi();
            }
        };

        t1.start();
        t2.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("劝告女生放弃等待");
        t2.interrupt();

    }
}


class Table{

    Lock myLock = new ReentrantLock();
    public void eatMi(){
        myLock.lock();//---------------上锁
        try{
            String name = Thread.currentThread().getName();
            System.out.println(name + "获得了锁，正在执行重要任务");
            mySleep(3000 * 1);
        }finally {
            String name = Thread.currentThread().getName();
            System.out.println(name + "释放了锁");
            myLock.unlock();//---------释放锁
        }
    }

    //为了让代码更优雅，编写统一的休眠方法
    public static void mySleep(long m){
        try {
            Thread.sleep(m);
        } catch (InterruptedException e) {
            //e.printStackTrace();
            System.out.println("---阻塞被打断");
        }
    }
}
